
#include "cx_core_vre.h"
#include "cx_moduleinterface.h"

#define THIS_FILE	    "cx_core_vre.c"


/////////////////////////////////////////////////////////////////////////////
//
// CxVreCore implementation
//
// 
// CxVreCore::CxVreCore()
// {
// }
// 
// 
// // Get CxVreCoreinstance
// CxVreCore* CxVreCore::Instance()
// {
//     static CxVreCore instance_;
//     return &instance_;
// }
// 
// 
// // Initialize
// int CxVreCore::Initialize()
// {
//     int err = 0;
//     
//     return err;
// }
// 
// // Shutdown
// void CxVreCore::Shutdown()
// {
//     if(pModuleMgr_)
// 	{
// 		pModuleMgr_->release(pModuleMgr_);
// 		pModuleMgr_ = NULL;
// 	}
// }
// 
// //set module mgr
// void CxVreCore::SetModuleMgr(IModuleManager *pModuleMgr)
// {
// 	if(pModuleMgr)
// 	{
// 		if(pModuleMgr_)
// 			pModuleMgr_->release(pModuleMgr_);
// 		pModuleMgr_ = pModuleMgr;
// 		pModuleMgr_->retain(pModuleMgr_);
// 	}
// }
// 
// // Register module
// void CxVreCore::RegisterModule(IModule* pModule)
// {
// 	if(pModuleMgr_)
// 		pModuleMgr_->registermodule(pModuleMgr_,pModule);
// }
// 
// //Unregister module
// void CxVreCore::UnRegisterModule(int moduleid)
// {
// 	if(pModuleMgr_)
// 		pModuleMgr_->unregistermodule(pModuleMgr_,moduleid);
// }
// 
// IModule* CxVreCore::GetModule(int moduleid)
// {
// 	if(pModuleMgr_)
// 	{
// 		return pModuleMgr_->getmodule(pModuleMgr_,moduleid);
// 	}
// 	return NULL;
// }
// 
// //send message
// int  CxVreCore::SendMessageToModule(int message, unsigned int wParam, unsigned int lParam,int toModlueid,int fromModuleid)
// {
// 	if(pModuleMgr_)
// 		return pModuleMgr_->sendmessage(pModuleMgr_,message,wParam,lParam,toModlueid,fromModuleid);
// 	return -1;
// }
// 
// //send message
// int  CxVreCore::PostMessageToModule(int message, unsigned int wParam, unsigned int lParam,int toModlueid,int fromModuleid)
// {
// 	if(pModuleMgr_)
// 		return pModuleMgr_->postmessage(pModuleMgr_,message,wParam,lParam,toModlueid,fromModuleid);
// 	return -1;
// }
// 
// /*
//  * cx_init(void).
//  * Init CXLIB!
//  */
int cx_init()
{

    // Initialize CxVreCoreinstance
//     CxVreCore*os = CxVreCore::Instance();
// 
//     int err; 
//     err = os->Initialize();
//     if (err != 0)
// 	{
//     	goto on_error;
// 	}
// 
//     return 0;
// 
// on_error:
//     cx_shutdown();
//     return err;
}

static IModuleManager* gModuleMgr;

void cx_shutdown(void)
{
   
    //CxVreCore*os = CxVreCore::Instance();
    //os->Shutdown();
    if(gModuleMgr)
	{
		gModuleMgr->release(gModuleMgr);
		gModuleMgr = NULL;
	}
}


void cx_setmodulemgr(IModuleManager* pModuleMgr)
{
// 	CxVreCore *os = CxVreCore::Instance();
// 	os->SetModuleMgr(pModuleMgr);
	if(pModuleMgr)
	{
		if(gModuleMgr)
			gModuleMgr->release(gModuleMgr);
		gModuleMgr = pModuleMgr;
		gModuleMgr->retain(gModuleMgr);
	}
}
	
void cx_registermodule(IModule* pModule)
{
// 	CxVreCore *os = CxVreCore::Instance();
// 	os->RegisterModule(pModule);
	if(gModuleMgr)
		gModuleMgr->registermodule(gModuleMgr,pModule);
}

void cx_unregistermodule(int moduleid)
{
// 	CxVreCore *os = CxVreCore::Instance();
// 	os->UnRegisterModule(moduleid);
	if(gModuleMgr)
		gModuleMgr->unregistermodule(gModuleMgr,moduleid);
}

IModule* cx_getmodule(int moduleid)
{
// 	CxVreCore *os = CxVreCore::Instance();
// 	return os->GetModule(moduleid);
	if(gModuleMgr)
	{
		return gModuleMgr->getmodule(gModuleMgr,moduleid);
	}
	return NULL;
}

int  cx_sendmessage(int message, unsigned int wParam, unsigned int lParam,int toModlueid,int fromModuleid)
{
// 	CxVreCore *os = CxVreCore::Instance();
// 	return os->SendMessageToModule(message,  wParam,  lParam, toModlueid, fromModuleid);	
	if(gModuleMgr)
		return gModuleMgr->sendmessage(gModuleMgr,message,wParam,lParam,toModlueid,fromModuleid);
	return -1;
}
int  cx_postmessage(int message, unsigned int wParam, unsigned int lParam,int toModlueid,int fromModuleid)
{
// 	CxVreCore *os = CxVreCore::Instance();
// 	return os->PostMessageToModule(message,  wParam,  lParam, toModlueid, fromModuleid);
	if(gModuleMgr)
		return gModuleMgr->postmessage(gModuleMgr,message,wParam,lParam,toModlueid,fromModuleid);
	return -1;
}